﻿#ifndef STRATEGY_H
#define STRATEGY_H

#include "player.h"
#include "playhand.h"



class Strategy
{
public:
    Strategy(Player* player,Cards& cards);
    //制定出牌策略
    Cards makeStrategy();
    //第一个出牌
    Cards firstPlay();
    //得到比指定牌型大的牌
    Cards getGreaterCards(PlayHand hand);
    //能大过指定的牌时，判断是出牌还是放行，
    bool whetherToBeat(Cards cards);

    //找出指定点数和指定数量的牌
    Cards findSamePointCards(Card::CardPoint point,int count);
    //找出所有数量为count的所有点数的牌，返回一个数组
    QVector<Cards> findCardsByCount(int count);
    //根据点数范围找牌
    Cards getRangeCards(Card::CardPoint begin,Card::CardPoint end);
    //按照牌型找牌，并且指定要找的牌是否大过指定的牌型
    QVector<Cards> findCardType(PlayHand hand,bool beat);
    //最优顺子的集合的筛选函数
     QVector<Cards> pickOptimalSeqSingles();
private:
    using function=Cards (Strategy::*)(Card::CardPoint point);
    struct CardInfo
    {
        Card::CardPoint begin;
        Card::CardPoint end;
        int extra;
        bool beat;
        int number;//指定点数的牌的数量
        int base;//最基础的顺子或者连对的数量
        function getSeq;
    };
    //从哪一个点数开始，找多少该点数张牌
    QVector<Cards> getCards(Card::CardPoint point,int number);
    //找可以3带1或者3带2的牌的数组 type取值Hand_Single,Hand_Pair
    QVector<Cards> getTripleSingleOrPair(Card::CardPoint point ,PlayHand::HandType type);
    //找飞机牌--两组3张
    QVector<Cards> getPlane(Card::CardPoint point);
    //找飞机牌--两组3张带单牌或对牌
    QVector<Cards> getPlane2SingleOr2Pair(Card::CardPoint point ,PlayHand::HandType type);
    //连对牌
    QVector<Cards> getSepPairOrSingle(CardInfo &info);
    Cards getBaseSeqPair(Card::CardPoint point);
    Cards getBaseSeqSingle(Card::CardPoint point);
    //炸弹牌
    QVector<Cards> getBomb(Card::CardPoint point);
    //从指定的cards对象内挑选满足条件的顺子
    void pickSeqSingles(QVector<QVector<Cards>>& allSeqRecord,QVector<Cards> &seqSingle,Cards& cards);


private:

    Player* m_player;
    Cards m_cards;
};

#endif // STRATEGY_H
